<?php

namespace Hilaoyu\ComputeCloudClient\Interfaces;


use Hilaoyu\ComputeCloudClient\AssetModel;
use Hilaoyu\ComputeCloudClient\AssetModels;

interface ApiEcsInterface
{

    public function getError($reArr = true, $clean = true);
    /**
     * 列出区域
     * @return array [["id"=>"regionId","name"=>"regionName"],...]
     */
    public function regionsDescribe():array;

    /**
     * 列出区域下的可用区
     * @param string $regionId 区域ID
     * @return array [["id"=>"zoneId","name"=>"zoneName"],...]
     */
    public function zonesDescribe($regionId=''):array;
    //安全组

    /**
     * 创建安全组
     * @param string $securityGroupName 安全组名
     * @param string $vpcId 专用网络ID
     * @param string $securityGroupType 安全组类型
     * @param string $regionId 区域ID
     * @param null $resourceGroupId 资源组ID
     * @return AssetModel
     */
    public function securityGroupCreate(string $securityGroupName = null, string $vpcId = null, string $securityGroupType = '', $regionId = '', $resourceGroupId = null):?AssetModel;

    /**
     * 删除安全组
     * @param null $securityGroupId 安全组ID
     * @param string $regionId 区域ID
     * @return bool
     */
    public function securityGroupDelete(string $securityGroupId, $regionId = ''):bool;

    /**
     * 列出安全组
     * @param array $securityGroupIds
     * @param string $securityGroupName
     * @param string $vpcId
     * @param int $pageSize
     * @param int $pageNumber
     * @param string $regionId
     * @param null $resourceGroupId
     * @return AssetModels
     */
    public function securityGroupsDescribe(array $securityGroupIds = [],string $securityGroupName = null, string $vpcId = null,int $pageSize=50,int $pageNumber=1, $regionId = '',$resourceGroupId = null):AssetModels;
    public function securityGroupDescribe(string $securityGroupId, $regionId = ''):?AssetModel;
    /**
     * 添加入方向规则
     * @param $securityGroupId
     * @param string $ipProtocol 协议
     * @param string $portRange 目的端安全组开放的传输层协议相关的端口范围。
     * @param string $policy accept|drop
     * @param string $sourceCidrIp 源端IPv4 CIDR地址段。
     * @param string $sourcePortRange 源端安全组开放的传输层协议相关的端口范围。
     * @param string $destCidrIp 目的端IPv4 CIDR地址段。
     * @param int $priority 优先级 1~100
     * @param string $regionId
     * @return bool
     */
    public function securityGroupAuthorize($securityGroupId,$portRange,$policy='',$sourceCidrIp='',$ipProtocol='',$sourcePortRange=null,$destCidrIp=null,$priority=1, $regionId = ''):bool;

    /**
     * 移出入方向规则
     * @param $securityGroupId
     * @param string $ipProtocol 协议
     * @param string $portRange 目的端安全组开放的传输层协议相关的端口范围。
     * @param string $policy accept|drop
     * @param string $sourceCidrIp 源端IPv4 CIDR地址段。
     * @param string $sourcePortRange 源端安全组开放的传输层协议相关的端口范围。
     * @param string $destCidrIp 目的端IPv4 CIDR地址段。
     * @param string $regionId
     * @return bool
     */
    public function securityGroupRevoke($securityGroupId,$portRange,$policy='',$sourceCidrIp='',$ipProtocol='',$sourcePortRange=null,$destCidrIp=null, $regionId = ''):bool;

    /**
     * 添加出方向规则
     * @param $securityGroupId
     * @param string $portRange 目的端安全组开放的传输层协议相关的端口范围。
     * @param string $policy accept|drop
     * @param string $destCidrIp 目的端IPv4 CIDR地址段。
     * @param string $ipProtocol 协议
     * @param string $sourcePortRange 源端安全组开放的传输层协议相关的端口范围。
     * @param string $sourceCidrIp 源端IPv4 CIDR地址段。
     * @param int $priority 优先级 1~100
     * @param string $regionId
     * @return bool
     */
    public function securityGroupEgressAuthorize($securityGroupId,$portRange,$policy='',$destCidrIp='',$ipProtocol='',$sourcePortRange=null,$sourceCidrIp=null, $priority=1,$regionId = ''):bool;
    /**
     * 添加出方向规则
     * @param $securityGroupId
     * @param string $portRange 目的端安全组开放的传输层协议相关的端口范围。
     * @param string $policy accept|drop
     * @param string $destCidrIp 目的端IPv4 CIDR地址段。
     * @param string $ipProtocol 协议
     * @param string $sourcePortRange 源端安全组开放的传输层协议相关的端口范围。
     * @param string $sourceCidrIp 源端IPv4 CIDR地址段。
     * @param string $regionId
     * @return bool
     */
    public function securityGroupEgressRevoke($securityGroupId,$portRange,$policy='accept',$destCidrIp='0.0.0.0/0',$ipProtocol='tcp',$sourcePortRange=null,$sourceCidrIp=null, $regionId = ''):bool;



    /**
     * @param null $instanceType 指定实例类型可以使用的镜像。
     * @param null $osType 镜像的操作系统类型
     * @param string $architecture 镜像的体系架构。取值范围：
     * @param null $imageName 镜像名称,可用*号通配
     * @param null $imageId 镜像ID,可用*号通配
     * @param int $pageNumber
     * @param int $pageSize
     * @param string $regionId
     * @return AssetModels
     */
    public function imagesDescribe(string $imageName=null,$imageId=null,$instanceType=null,$osType=null,$architecture='',$regionId = '', $zoneId = ''):AssetModels;

    /**
     * @param string $imageId
     * @return AssetModel|null
     */
    public function imageDescribe(string $imageId, $regionId = '', $zoneId = ''):?AssetModel;
    /**
     * 列出实例规格
     * @param array $instanceTypes 规格
     * @return AssetModels
     */
    public function instanceTypesDescribe(array $instanceTypes=[],string $zoneId='',string $regionId = ''):AssetModels;

    /**
     * @param string $instanceType
     * @return AssetModel|null
     */
    public function instanceTypeDescribe(string $instanceType,string $zoneId='',string $regionId = ''):?AssetModel;
    //实例

    /**
     * 创建实例
     * @param string $instanceType 实例规格
     * @param string $imageId 镜像文件ID
     * @param string $password 密码
     * @param string  $instanceName 实例名 允许大小写英文字母、数字和短横线（-）
     * @param string  $vSwitchId 虚拟交换机ID
     * @param string $instanceChargeType 实例的付费方式。
     * @param string $internetChargeType 网络计费类型。
     * @param int $period 时长
     * @param string $periodUnit 时长单位
     * @param int $internetMaxBandwidth 公网带宽峰值 0为不需要公网IP
     * @param null $resourceGroupId 资源组ID
     * @param int $systemDiskSize 系统盘大小
     * @param null $securityGroupId 安全组ID
     * @param string $regionId
     * @return AssetModel
     */
    public function instanceCreate(string $instanceType,string $imageId,string $password,string $instanceName=null,string $vSwitchId=null,$internetMaxBandwidth=0,$securityGroupId=null,$period=1,$periodUnit='',$instanceChargeType='',$internetChargeType='',int $systemDiskSize=null,$zoneId = null,$regionId = '',$resourceGroupId=null):?AssetModel;

    /**
     * 实例申请公网IP
     * @param string $instanceId
     * @param string $regionId
     * @return string
     */
    public function publicIpAddressAllocate(string $instanceId,int $bandwidth=100, $regionId = ''):string;
    /**
     * 列出实例
     * @param array $instanceIds [实例ID]
     * @param null $vSwitchId 虚拟交换机ID
     * @param string $regionId
     * @return AssetModels
     */
    public function instancesDescribe(array $instanceIds=[],$vSwitchId=null,$zoneId="", $regionId = ''):AssetModels;

    /**
     * 实例详情
     * @param string $instanceId 实例ID
     * @param string $regionId
     * @return AssetModel|null
     */
    public function instanceDescribe(string $instanceId,$zoneId="", $regionId = ''):?AssetModel;

    /**
     * 启动实例
     * @param array $instanceId 实例ID
     * @param string $regionId
     * @return AssetModels
     */
    public function instancesStart(array $instanceId,$regionId=''):AssetModels;
    /**
     * 实例们状态
     * @param array $instanceId 实例ID
     * @param string $regionId
     * @return AssetModels
     */
    public function instancesStatusDescribe(array $instanceId,$regionId=''):AssetModels;
    /**
     * 实例状态
     * @param array $instanceId 实例ID
     * @param string $regionId
     * @return AssetModel|null
     */
    public function instanceStatusDescribe(string $instanceId,$regionId=''):?AssetModel;

    /**
     * 停止实例
     * @param array $instanceId 实例ID
     * @param string $regionId
     * @return AssetModels
     */
    public function instancesStop(array $instanceId,$regionId=''):AssetModels;
    /**
     * 重启实例
     * @param array $instanceId 实例ID
     * @param string $regionId
     * @return AssetModels
     */
    public function instancesReboot(array $instanceId,$regionId=''):AssetModels;
    /**
     * 删除实例
     * @param array $instanceId 实例ID
     * @param string $force 强制
     * @param string $regionId
     * @return bool
     */
    public function instancesDelete(array $instanceId,$force=false,$regionId=''):bool;

    public function instanceAttributeModify(string $instanceId, string $password='',string $name='',string $hostName='',$userData= null, $regionId = ''):bool;


    /**
     * 修改实例vnc密码
     * @param string $instanceId 实例ID
     * @param string $regionId
     * @return AssetModel|null
     */
    public function instanceVncPasswdModify(string $instanceId, string $vncPassword, $regionId = ''):?AssetModel;

    /**
     * 查询实例vnc地址
     * @param string $instanceId 实例ID
     * @param string $regionId
     * @return string
     */
    public function instanceVncUrlDescribe(string $instanceId, string $vncPassword = '', $regionId = ''):string;

    /**
     * 重装系统
     * @param string $instanceId 实例ID
     * @param string $imageId 镜像ID
     * @param string $password 实例密码
     * @param string $regionId
     * @return AssetModel|null
     */
    public function systemDiskReplace(string $instanceId,string $imageId,string $password,$regionId=''):?AssetModel;

    /**
     * 创建系统快照
     * @param string $instanceId
     * @param string $name 快照名
     * @param string $regionId
     * @return bool
     */
    public function systemDiskSnapshotCreate(string $instanceId, string $name='', $regionId = ''): bool;

    /**
     * 创建弹性网卡
     * @param string $vSwitchId
     * @param string $networkInterfaceName
     * @param array $securityGroupIds
     * @param string $regionId
     * @return AssetModel
     */
    public function networkInterfaceCreate(string $vSwitchId,string $networkInterfaceName=null,array $securityGroupIds=[], $regionId = ''):?AssetModel;

    /**
     * 弹性网卡详情，多个
     * @param array $networkInterfaceId
     * @param null $instanceId
     * @param string $regionId
     * @return AssetModels
     */
    public function networkInterfacesDescribe(array $networkInterfaceId=[],$instanceId=null, $regionId = ''):AssetModels;

    /**
     * 弹性网卡详情，单个
     * @param string $networkInterfaceId
     * @param string $regionId
     * @return AssetModel|null
     */
    public function networkInterfaceDescribe(string $networkInterfaceId, $regionId = ''):?AssetModel;
    /**
     * 删除弹性网卡
     * @param string $networkInterfaceId
     * @param string $regionId
     * @return bool
     */
    public function networkInterfaceDelete(string $networkInterfaceId, $regionId = ''):bool;

    /**
     * 附加弹性网卡到实例上
     * @param string $networkInterfaceId
     * @param string $instanceId
     * @param string $regionId
     * @return mixed
     */
    public function networkInterfaceAttach(string $networkInterfaceId,string $instanceId, $regionId = ''):?AssetModel;

    /**
     * 从实例上分离一个弹性网卡
     * @param string $networkInterfaceId
     * @param string $instanceId
     * @param string $regionId
     * @return mixed
     */
    public function networkInterfaceDetach(string $networkInterfaceId,string $instanceId, $regionId = ''):?AssetModel;

    /**
     * 创建助手命令
     * @param string $commandContent
     * @param string $name
     * @param string $type
     * @param string $regionId
     * @return AssetModel|null
     */
    public function commandCreate(string $commandContent,string $name,string $type='RunShellScript', $regionId = ''):?AssetModel;

    /**
     * 查询助手命令 多条
     * @param string|null $commandId
     * @param string|null $name
     * @param string|null $type
     * @param string $regionId
     * @return AssetModels
     */
    public function commandsDescribe(string $commandId=null,string $name=null,string $type=null, $regionId = ''):AssetModels;

    /**
     * 查询助手命令 单条
     * @param string $commandId
     * @param string $regionId
     * @return AssetModel|null
     */
    public function commandDescribe(string $commandId, $regionId = ''):?AssetModel;

    /**
     * 删除助手命令
     * @param string $commandId
     * @param string $regionId
     * @return bool
     */
    public function commandDelete(string $commandId, $regionId = ''):bool;

    /**
     * 执行助手命令
     * @param string $commandId
     * @param array $instanceId
     * @param string|null $frequency
     * @param string $regionId
     * @return mixed
     */
    public function commandInvoke(string $commandId,array $instanceId,string $frequency=null,$regionId = ''):?string;

    /**
     * 运行命令
     * @param string $commandContent 命令内容
     * @param array $instanceId ecs实例ID
     * @param string $type 命令类型  RunBatScript：适用于Windows实例的Bat命令 ；RunPowerShellScript：适用于Windows实例的PowerShell命令； RunShellScript：适用于Linux实例Shell命令。
     * @param string $contentEncoding 命令编码方式 PlainText：不编码，采用明文传输 ；Base64：Base64编码。
     * @param string $regionId
     * @return bool
     */
    public function commandRun(string $commandContent,array $instanceIds,string $type='RunShellScript',string $contentEncoding='PlainText',$regionId = ''):?string;

    /**
     * @param string $invokeId 命令执行ID
     * @param string $commandId 命令ID
     * @param string $instanceId 实例ID
     * @param string $regionId
     * @return array|null
     *
     *{
        "TotalCount": 1,
        "PageSize": 10,
        "RequestId": "xxxx",
        "PageNumber": 1,
        "Invocations": {
            "InvokeId" : {
                "InvocationStatus": "Success",
                "Parameters": "{}",
                "Timed": false,
                "InvokeInstances": {
                    "InstanceId": {
                        "Dropped": 0,
                        "InvocationStatus": "Success",
                        "InstanceId": "",
                        "Timed": false,
                        "InstanceInvokeStatus": "Finished",
                        "ExitCode": 0,
                        "ErrorInfo": "",
                        "StartTime": "2021-11-18T14:53:52Z",
                        "Repeats": 1,
                        "FinishTime": "2021-11-18T14:54:01Z",
                        "Output": "base64 xxx",
                        "CreationTime": "2021-11-18T14:53:52Z",
                        "UpdateTime": "2021-11-18T14:54:01Z",
                        "ErrorCode": "",
                        "StopTime": ""
                    }
                },
                "CommandContent": "base64 xxx",
                "RepeatMode": "Once",
                "InvokeStatus": "Finished",
                "CommandType": "RunShellScript",
                "Username": "",
                "CreationTime": "2021-11-18T14:53:52Z",
                "Frequency": "",
                "CommandId": "c-zj022i8qammgv7k",
                "CommandName": "cmd-2021-11-18",
                "InvokeId": "t-zj022i8qamoyrk0"
            }
        }
    }
     */
    public function commandInvocationsDescribe(string $invokeId='',string $commandId='',string $instanceId='',$regionId = ''):?array;

    /**
     * 创建磁盘
     * @param int $size 大小
     * @param string|null $diskCategory 类型 默认值：cloud。
     * cloud：普通云盘；cloud_efficiency：高效云盘；cloud_ssd：SSD云盘；cloud_essd：ESSD云盘
     * @param string|null $diskName
     * @param string|null $instanceId 绑定实例ID
     * @param string|null $zoneId 不传入实例ID时此项必传
     * @param string $regionId
     * @return AssetModel|null
     */
    public function diskCreate(int $size,string $diskCategory=null,string $diskName=null,string $instanceId=null,string $zoneId=null, $regionId = ''):?AssetModel;


    /**
     * 磁盘详情 多条
     * @param array $diskIds
     * @param null $instanceId
     * @param string $regionId
     * @return AssetModels
     */
    public function disksDescribe(array $diskIds=[],$instanceId=null, $regionId = ''):AssetModels;

    /**
     * 磁盘详情 单条
     * @param string $diskId
     * @param string $regionId
     * @return AssetModel|null
     */
    public function diskDescribe(string $diskId, $regionId = ''):?AssetModel;

    public function diskUpdate(string $diskId,$name='', $regionId = ''): ?AssetModel;

    /**
     * 挂载磁盘
     * @param string $diskId
     * @param string $instanceId 实例ID
     * @param bool $bootable 是否可启动
     * @param bool $deleteWithInstance 是否和实例一起释放
     * @param string $regionId
     * @return mixed
     */
    public function diskAttach(string $diskId,string $instanceId,bool $bootable=false,bool $deleteWithInstance=false, $regionId = ''):?AssetModel;

    /**
     * 卸载磁盘
     * @param string $diskId
     * @param string $instanceId 实例ID
     * @param string $regionId
     * @return AssetModel|null
     */
    public function diskDetach(string $diskId,string $instanceId, $regionId = ''):?AssetModel;


    /**
     * 删除磁盘
     * @param string $diskId
     * @param string $regionId
     * @return bool
     */
    public function diskDelete(string $diskId, $regionId = ''):bool;

    /**
     * 创建磁盘快照
     * @param string $diskId
     * @param string $name 快照名
     * @param string $regionId
     * @return bool
     */
    public function diskSnapshotCreate(string $diskId, string $name='', $regionId = ''): bool;
}

